home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / du_lib / proc_msg.c < prev    next >
C/C++ Source or Header  |  1995-07-10  |  11KB  |  415 lines

  1. /* 
  2.   DU_LIB v2 
  3.   Gem Window Management & Dialog Library For Lattice C 
  4.   ½1994,95, by Craig Graham. 
  5.  
  6.   Based on the DU_LIBv1 Library for HiSoft Basic. 
  7. */
  8.  
  9. /* 
  10.    GEM AES message handler 
  11. */
  12.  
  13. #include "dulib.h"
  14.  
  15. event process_message(short mb[]) 
  16.     short m,arrow_m,x,y,w,h; 
  17.     short e_wind; 
  18.     OBJECT *a_l; 
  19.     short sx,sy,sw,sh; 
  20.     short a,b; 
  21.     CallBack custom_handler; 
  22.     window_widget_response widget_callbacks;
  23.     CallBack widget_handler;
  24.     event ret_v;
  25.     Wtype t;
  26.  
  27.     ret_v=0; 
  28.     a_l=0;
  29.  
  30.      e_wind=mb[3];    /*Window for which the message arrived*/ 
  31.  
  32.     m=mb[0];        /*Message type*/ 
  33.  
  34.     if (!xacc_message(mb))
  35.     {
  36.         if (m==MN_SELECTED)        /*Event was a menu*/ 
  37.         { 
  38.             rsrc_gaddr(0,menu,&a_l); 
  39.             custom_handler=Get_object_callback(menu, mb[4]);    /*Check for a custom object handler*/ 
  40.             if (!custom_handler) 
  41.             { 
  42.                 ret_v=Get_object_event(menu,mb[4]);    /*Return menu item selected*/ 
  43.                 menu_tnormal(a_l,e_wind,1); 
  44.             }else{
  45.                 this_dialog=menu; this_ob=mb[4];
  46.                 (*custom_handler)();                   /*Call a custom handler for that selection*/ 
  47.                 menu_tnormal(a_l,e_wind,1); 
  48.             }
  49.         } else { 
  50.             if (windows[e_wind].window_type==wt_null) return ret_v;
  51.             
  52.             this_dialog=windows[e_wind].the_dialog;
  53.             cr_wind_handle=e_wind;
  54.             widget_callbacks=dialog_details[windows[e_wind].the_dialog].wind_widgets;
  55.  
  56.             switch(m)                                /*Common messages for all window types*/
  57.             {
  58.                                                     /*Xacc2 support*/
  59.                 case ACC_TEXT:                        /*Recieve Text*/
  60.                     if (XaccTextHandler)
  61.                     {
  62.                         if ((*XaccTextHandler)())
  63.                         {
  64.                             xacc_ack( mb[1], TRUE );
  65.                         }else{
  66.                             xacc_ack( mb[1], FALSE );
  67.                         }
  68.                     }else{
  69.                         xacc_ack( mb[1], FALSE );
  70.                     }
  71.                     break;
  72.                 case WM_CLOSED:
  73.                     widget_handler=widget_callbacks.close_widget;
  74.                     if (widget_handler)
  75.                     {
  76.                         (*widget_handler)();
  77.                     }else{
  78.                         close_dialog_window(e_wind);
  79.                     }
  80.                     break;
  81.                 case WM_TOPPED:
  82.                     wind_get(e_wind,WF_TOP,&a,0,0,0);
  83.                     if (a==e_wind)
  84.                     {
  85.                         wind_set(e_wind,WF_BOTTOM,0,0,0,0); 
  86.                     } else { 
  87.                         wind_set(e_wind,WF_TOP,0,0,0,0); 
  88.                     } 
  89.                     ret_v=3;
  90.                     break; 
  91.                 case WM_BOTTOMED: 
  92.                     wind_set(e_wind,WF_BOTTOM,0,0,0,0); 
  93.                     break; 
  94.                 case WM_UNTOPPED: 
  95.                     break; 
  96.                 case WM_REDRAW: 
  97.                     udx=mb[4]; udy=mb[5]; 
  98.                     udw=mb[6]; udh=mb[7]; 
  99.                     redraw_window(e_wind); 
  100.                     break;
  101.                 case WM_CUSTOM_REDRAW: 
  102.                     udx=mb[4]; udy=mb[5]; 
  103.                     udw=mb[6]; udh=mb[7]; 
  104.                     custom_redraw_window(e_wind); 
  105.                     break;
  106.                 case WM_HSLID:
  107.                     wind_set(e_wind,WF_HSLIDE,mb[4],0,0,0);
  108.                     widget_handler=widget_callbacks.h_slide;
  109.                     if (widget_handler)
  110.                     {
  111.                         (*widget_handler)();
  112.                     }else{
  113.                         if (windows[e_wind].redraw_mode==wrm_window)
  114.                         {
  115.                             if (windows[e_wind].window_type==wt_drawing)
  116.                             {
  117.                                 custom_update_window(e_wind);
  118.                             }else{
  119.                                 update_window(e_wind);
  120.                             }
  121.                         }
  122.                     }
  123.                     break;
  124.                 case WM_VSLID:
  125.                     wind_set(e_wind,WF_VSLIDE,mb[4],0,0,0);
  126.                     widget_handler=widget_callbacks.v_slide;
  127.                     if (widget_handler)
  128.                     {
  129.                         (*widget_handler)();
  130.                     }else{
  131.                         if (windows[e_wind].redraw_mode==wrm_window)
  132.                         {
  133.                             if (windows[e_wind].window_type==wt_drawing)
  134.                             {
  135.                                 custom_update_window(e_wind);
  136.                             }else{
  137.                                 update_window(e_wind);
  138.                             }
  139.                         }
  140.                     }
  141.                     break;
  142.                 case WM_ICONIFY:
  143.                     widget_handler=widget_callbacks.iconify_widget;
  144.                     if (widget_handler)
  145.                     {
  146.                         (*widget_handler)();
  147.                     }else{
  148.                         wind_get(e_wind,WF_CURRXYWH,&sx,&sy,&sw,&sh); 
  149.                         wind_set(e_wind,WF_ICONIFY,0,0,0,0);
  150.                         wind_set(e_wind,WF_CURRXYWH,mb[4],mb[5],mb[6],mb[7]); 
  151.                     }
  152.                     break;
  153.                 case WM_ARROWED:
  154.                     arrow_m=mb[4];
  155.                     widget_handler=widget_callbacks.arrows[arrow_m];
  156.                     if (widget_handler)
  157.                     {
  158.                         (*widget_handler)();
  159.                     }else{
  160.                         arrow_m|=128;
  161.                         switch(arrow_m)
  162.                         {
  163.                             case WIDGET_ARROW_UPPAGE:
  164.                                 wind_get(e_wind,WF_VSLIDE,&a,0,0,0);
  165.                                 a-=100;
  166.                                 if (a<0) a=0;
  167.                                 wind_set(e_wind,WF_VSLIDE,a,0,0,0);
  168.                                 break;
  169.                             case WIDGET_ARROW_DNPAGE:
  170.                                 wind_get(e_wind,WF_VSLIDE,&a,0,0,0);
  171.                                 a+=100;
  172.                                 if (a>1000) a=1000;
  173.                                 wind_set(e_wind,WF_VSLIDE,a,0,0,0);
  174.                                 break;
  175.                             case WIDGET_ARROW_UPLINE:
  176.                                 wind_get(e_wind,WF_VSLIDE,&a,0,0,0);
  177.                                 a-=5;
  178.                                 if (a<0) a=0;
  179.                                 wind_set(e_wind,WF_VSLIDE,a,0,0,0);
  180.                                 break;
  181.                             case WIDGET_ARROW_DNLINE:
  182.                                 wind_get(e_wind,WF_VSLIDE,&a,0,0,0);
  183.                                 a+=5;
  184.                                 if (a>1000) a=1000;
  185.                                 wind_set(e_wind,WF_VSLIDE,a,0,0,0);
  186.                                 break;
  187.                             case WIDGET_ARROW_LFPAGE:
  188.                                 wind_get(e_wind,WF_HSLIDE,&a,0,0,0);
  189.                                 a-=100;
  190.                                 if (a<0) a=0;
  191.                                 wind_set(e_wind,WF_HSLIDE,a,0,0,0);
  192.                                 break;
  193.                             case WIDGET_ARROW_RTPAGE:
  194.                                 wind_get(e_wind,WF_HSLIDE,&a,0,0,0);
  195.                                 a+=100;
  196.                                 if (a>1000) a=1000;
  197.                                 wind_set(e_wind,WF_HSLIDE,a,0,0,0);
  198.                                 break;
  199.                             case WIDGET_ARROW_LFLINE:
  200.                                 wind_get(e_wind,WF_HSLIDE,&a,0,0,0);
  201.                                 a-=5;
  202.                                 if (a<0) a=0;
  203.                                 wind_set(e_wind,WF_HSLIDE,a,0,0,0);
  204.                                 break;
  205.                             case WIDGET_ARROW_RTLINE:
  206.                                 wind_get(e_wind,WF_HSLIDE,&a,0,0,0);
  207.                                 a+=5;
  208.                                 if (a>1000) a=1000;
  209.                                 wind_set(e_wind,WF_HSLIDE,a,0,0,0);
  210.                                 break;
  211.                         }
  212.                         if (windows[e_wind].window_type==wt_drawing)
  213.                         {
  214.                             custom_update_window(e_wind);
  215.                         }else{
  216.                             update_window(e_wind);
  217.                         }
  218.                     }
  219.                     break;
  220.             }
  221.         
  222.             t=windows[e_wind].window_type;            /* Type of window we are looking at */ 
  223.             switch(t)
  224.             {
  225.                 case wt_dialog:
  226.                 case wt_dialog_side_bar:
  227.                 case wt_dialog_bottom_bar:
  228.                     switch(m)
  229.                     {
  230.                         case WM_FULLED:                        /*With Dialog Windows, make them Roll-Ups*/ 
  231.                             widget_handler=widget_callbacks.full_widget;
  232.                             if (widget_handler)
  233.                             {
  234.                                 (*widget_handler)();
  235.                             }else{
  236.                                 wind_get(e_wind,WF_WORKXYWH,&sx,&sy,&sw,&sh); 
  237.                                 if (sh) 
  238.                                 {
  239.                                     sh=0;
  240.                                 } else {
  241.                                      rsrc_gaddr(0,windows[e_wind].the_dialog,&a_l); 
  242.                                     form_center(a_l,&a,&b,&sw,&sh);
  243.                                 }
  244.                                 switch(t)
  245.                                 {
  246.                                     case wt_dialog:
  247.                                         wind_calc(WC_BORDER,NAME+CLOSER+FULLER+MOVER+SMALLER,sx,sy,sw,sh,&sx,&sy,&sw,&sh);
  248.                                         break;
  249.                                     case wt_dialog_side_bar:
  250.                                         wind_calc(WC_BORDER,NAME+CLOSER+FULLER+MOVER+UPARROW+DNARROW+VSLIDE+SMALLER,sx,sy,sw,sh,&sx,&sy,&sw,&sh);
  251.                                         break;
  252.                                     case wt_dialog_bottom_bar:
  253.                                         wind_calc(WC_BORDER,NAME+CLOSER+FULLER+MOVER+LFARROW+RTARROW+HSLIDE+SMALLER,sx,sy,sw,sh,&sx,&sy,&sw,&sh);
  254.                                         break;
  255.                                  }
  256.                                  wind_set(e_wind,WF_CURRXYWH,sx,sy,sw,sh);
  257.                              }
  258.                             break;
  259.                         case WM_MOVED: 
  260.                             if (mb[4]<0) { mb[4]=0; } 
  261.                             wind_set(e_wind,WF_CURRXYWH,mb[4],mb[5],mb[6],mb[7]); 
  262.                             rsrc_gaddr(0,windows[e_wind].the_dialog,&a_l); 
  263.                             wind_get(e_wind,WF_WORKXYWH,&x,&y,&w,&h); 
  264.                             if (h!=0)
  265.                             { 
  266.                                 a_l->ob_x=x; 
  267.                                 a_l->ob_y=y; 
  268.                             } 
  269.                             break; 
  270.                         case WM_UNICONIFY:
  271.                             wind_set(e_wind,WF_UNICONIFY,0,0,0,0);
  272.                              rsrc_gaddr(0,windows[e_wind].the_dialog,&a_l);
  273.                             form_center(a_l,&sx,&sy,&sw,&sh);
  274.                             wind_calc(0,15,sx,sy,sw,sh,&sx,&sy,&sw,&sh); 
  275.                              wind_set(e_wind,WF_CURRXYWH,sx,sy,sw,sh);
  276.                             break;
  277.                     }
  278.                     break;
  279.                 case wt_drawing:
  280.                     switch(m)
  281.                     {
  282.                         case WM_FULLED:                        /*With drawing (ie. work area/widget bar) Windows, make them full/shrink */ 
  283.                             widget_handler=widget_callbacks.full_widget;
  284.                             if (widget_handler)
  285.                             {
  286.                                 (*widget_handler)();
  287.                             }else{
  288.                                 wind_get(e_wind,WF_CURRXYWH,&sx,&sy,&sw,&sh); 
  289.                                 wind_get(e_wind,WF_FULLXYWH,&x,&y,&w,&h); 
  290.                                  if ((((sx!=x)||(sy!=y))||(sw!=w))||(sh!=h))
  291.                                  {
  292.                                      wind_set(e_wind,WF_CURRXYWH,x,y,w,h);
  293.                                  }else{
  294.                                     wind_get(e_wind,WF_PREVXYWH,&x,&y,&w,&h); 
  295.                                      wind_set(e_wind,WF_CURRXYWH,x,y,w,h);
  296.                                  }
  297.                                  rsrc_gaddr(0,windows[e_wind].the_dialog,&a_l); 
  298.                                 wind_get(e_wind,WF_WORKXYWH,&x,&y,&w,&h);
  299.                                 if (h!=0)
  300.                                 {
  301.                                     a_l->ob_x=x; 
  302.                                     a_l->ob_y=y;
  303.                                 }
  304.                             }
  305.                                break; 
  306.                         case WM_MOVED:
  307.                             if (mb[4]<0) { mb[4]=0; } 
  308.                             wind_set(e_wind,WF_CURRXYWH,mb[4],mb[5],mb[6],mb[7]); 
  309.                             rsrc_gaddr(0,windows[e_wind].the_dialog,&a_l); 
  310.                             wind_get(e_wind,WF_WORKXYWH,&x,&y,&w,&h); 
  311.                             if (h!=0)
  312.                             { 
  313.                                 a_l->ob_x=x; 
  314.                                 a_l->ob_y=y; 
  315.                             } 
  316.                             break; 
  317.                         case WM_SIZED:
  318.                             widget_handler=widget_callbacks.resize_widget;
  319.                             if (widget_handler)
  320.                             {
  321.                                 (*widget_handler)();
  322.                             }else{
  323.                                 if (mb[4]<0) { mb[4]=0; } 
  324.                                 wind_set(e_wind,WF_CURRXYWH,mb[4],mb[5],mb[6],mb[7]); 
  325.                                 rsrc_gaddr(0,windows[e_wind].the_dialog,&a_l);
  326.                                 wind_get(e_wind,WF_WORKXYWH,&x,&y,&w,&h);
  327.                                 if (h!=0)
  328.                                 {
  329.                                     a_l->ob_x=x; 
  330.                                     a_l->ob_y=y; 
  331.                                 }
  332.                             }
  333.                             break; 
  334.                         case WM_UNICONIFY:
  335.                             wind_get(e_wind,WF_UNICONIFYXYWH,&sx,&sy,&sw,&sh); 
  336.                             wind_set(e_wind,WF_UNICONIFY,0,0,0,0);
  337.                             wind_get(e_wind,WF_CURRXYWH,&sx,&sy,&sw,&sh); 
  338.                             wind_get(e_wind,WF_FULLXYWH,&x,&y,&w,&h); 
  339.                              if ((((sx!=x)||(sy!=y))||(sw!=w))||(sh!=h))
  340.                              {
  341.                                  wind_set(e_wind,WF_CURRXYWH,x,y,w,h);
  342.                              }else{
  343.                                 wind_get(e_wind,WF_PREVXYWH,&x,&y,&w,&h); 
  344.                                  wind_set(e_wind,WF_CURRXYWH,x,y,w,h);
  345.                              }
  346.                              rsrc_gaddr(0,windows[e_wind].the_dialog,&a_l); 
  347.                             wind_get(e_wind,WF_WORKXYWH,&x,&y,&w,&h);
  348.                             if (h!=0)
  349.                             {
  350.                                 a_l->ob_x=x; 
  351.                                 a_l->ob_y=y;
  352.                             }
  353.                                break; 
  354.                     }
  355.                     break;
  356.             }
  357.         }
  358.     }
  359.     return ret_v; 
  360. }
  361.  
  362. short redraw_window(short wind_handle) 
  363. {
  364.      wind_update(BEG_UPDATE); 
  365.     display_dial(wind_handle); 
  366.     wind_update(END_UPDATE);
  367.  
  368.     udx=udy=udw=udh=0 ;
  369.     return 0;
  370. }
  371.  
  372. short custom_redraw_window(short wind_handle) 
  373. {
  374.      wind_update(BEG_UPDATE); 
  375.     custom_display_dial(wind_handle); 
  376.     wind_update(END_UPDATE);
  377.  
  378.     udx=udy=udw=udh=0 ;
  379.     return 0;
  380. }
  381.  
  382. /*
  383.     Set the widget callback for a given dialog
  384. */
  385. void Set_dialog_widget_callback(short dialog, short widget, CallBack c)
  386. {
  387.     if (!(widget&128))
  388.     {
  389.         switch(widget)
  390.         {
  391.             case WIDGET_CLOSE:
  392.                 dialog_details[dialog].wind_widgets.close_widget=c;
  393.                 break;
  394.             case WIDGET_FULL:
  395.                 dialog_details[dialog].wind_widgets.full_widget=c;
  396.                 break;
  397.             case WIDGET_ICONIFY:
  398.                 dialog_details[dialog].wind_widgets.iconify_widget=c;
  399.                 break;
  400.             case WIDGET_RESIZE:
  401.                 dialog_details[dialog].wind_widgets.resize_widget=c;
  402.                 break;
  403.             case WIDGET_H_SLIDE:
  404.                 dialog_details[dialog].wind_widgets.h_slide=c;
  405.                 break;
  406.             case WIDGET_V_SLIDE:
  407.                 dialog_details[dialog].wind_widgets.v_slide=c;
  408.                 break;
  409.         }
  410.     }else{
  411.         dialog_details[dialog].wind_widgets.arrows[widget&~128]=c;
  412.     }
  413. }
  414.